package com.woniuxy.amusementparkos.controller.lsy;

import java.util.Arrays;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;

import com.woniuxy.amusementparkos.dto.lvd.TableDataDto;
import com.woniuxy.amusementparkos.entity.lsy.WristStarp;
import com.woniuxy.amusementparkos.entity.wyh.WristStrap_Repository;
import com.woniuxy.amusementparkos.exception.XlsxException;
import com.woniuxy.amusementparkos.service.wyh.WristStrap_RepositoryService;

import lombok.extern.slf4j.Slf4j;

/**
* @author Muzi
* 后台腕带仓库控制器
* 2020年4月30日上午10:23:44
*/
@Controller
@RequestMapping("/wristStrap")
@Slf4j
public class WristStrapBackendController {
	// 自动注入
	@Autowired
	private WristStrap_RepositoryService wristStrapService;
	
	@RequestMapping("/show")
	public ModelAndView show() {
		return new ModelAndView("lsy/wristStrap");
	}
	
	/**
	 * 带条件或无条件模糊查询所有非删除状态腕带信息
	 * @param page
	 * @param limit
	 * @return
	 */
	@RequestMapping("/getall")
	@ResponseBody
	public TableDataDto<WristStrap_Repository> getAllByPageAndLimitAndCondition(String condition,Integer type_id,
			Integer page,Integer limit){
		TableDataDto<WristStrap_Repository> result = new TableDataDto<>();
		// 声明变量，提高作用域
		List<WristStrap_Repository> wristStraps;
		Long count;
		// 判断是否含有条件
		if(condition == null||"".equals(condition)) {
			if(null == type_id||-1== type_id) {// -1为未选中状态
				// 当前分支为 无类型，无条件查找
				// 查询当前页的数据
				wristStraps = wristStrapService.selectAllByPageAndLimit(page, limit);
				// 查询当前条件的数据库的总条数
				count = wristStrapService.countWristStrapsByNoCondition();
			}else {
				// 当前分支为有类型，无其他条件查找
				// 查询当前页的数据
				wristStraps = wristStrapService.selectAllByPageAndType(type_id, page, limit);
				// 查询当前条件的数据库的总条数
				count = wristStrapService.countByType(type_id);
			}
			
		}else {
			if(null == type_id||-1== type_id) {
				// 当前分支为有条件，但不按类型查找
				// 查询当前页的数据
				wristStraps = wristStrapService.selectAllByPageAndCondition(
						condition, page, limit);
				// 查询当前条件的数据库的总条数
				count = wristStrapService.countWristStrapsByCondition(condition);
			}else {
				// 当前分支为有条件，并按分类查找
				// 查询当前页的数据
				wristStraps = wristStrapService.selectAllByPageAndConditionAndType(
						type_id,condition, page, limit);
				// 查询当前条件的数据库的总条数
				count = wristStrapService.countWristStrapsByConditionAndType(condition,type_id);
			}
			
		}
		// 存入数据模型
		result.setData(wristStraps);
		// 设置响应码
		result.setCode(0);
		// 总条数存入数据
		result.setCount(count);
		return result;
	}
	
	/**
	 * 按类型查询
	 * @param type_id
	 * @param page
	 * @param limit
	 * @return
	 */
	@RequestMapping("/getByType")
	@ResponseBody
	public TableDataDto<WristStrap_Repository> getAllByPageAndLimitAndType(Integer type_id,
			Integer page,Integer limit){
		TableDataDto<WristStrap_Repository> result = new TableDataDto<>();
		// 查询当页数据
		List<WristStrap_Repository> wristStraps = wristStrapService.selectAllByPageAndType(type_id, page, limit);
		// 计数总条数
		Long count = wristStrapService.countByType(type_id);
		// 将数据存入数据模型
		result.setData(wristStraps);
		// layui的table获取数据成功的响应状态
		result.setCode(0);
		// 当前数据总条数
		result.setCount(count);
		return result;
	}
	
	
	/**
	 * 删除单条腕带
	 * @param wriststrp_id
	 * @return
	 */
	@RequestMapping("/deleteOne")
	@ResponseBody
	public TableDataDto<WristStrap_Repository> deleteWristStrap_Repository(String wriststrp_id){
		TableDataDto<WristStrap_Repository> result = new TableDataDto<>();
		try {
			// 调用删除的service方法
			wristStrapService.deleteWristStrap(wriststrp_id);
		} catch (RuntimeException e) {
			// 设置响应码
			result.setCode(3);
			// 设置提示信息
			result.setMsg("删除失败，请检查数据是否合法");
			// 记录日志
			log.warn("WristStrapBackendController的deleteWristStrap_Repository操作发生异常："+e);
			return result;
		}
		// 纪录成功操作日志
		log.info("腕带仓库删除腕带，被删除的编号是："+wriststrp_id);
		// 设置成功操作的提示信息
		result.setCode(1);
		result.setMsg("删除成功");
		return result;
	}
	
	/**
	 * 更新腕带
	 * @param wristStrap_Repository
	 * @return
	 */
	@RequestMapping("/updateOne")
	@ResponseBody
	public TableDataDto<WristStrap_Repository> updateWristStrap_Repository(
			WristStrap_Repository wristStrap_Repository){
		TableDataDto<WristStrap_Repository> result = new TableDataDto<>();
		try {
			// 调用service层，捕获异常
			wristStrapService.updateWristStrap(wristStrap_Repository);
		} catch (RuntimeException e) {
			// 设置响应码
			result.setCode(3);
			// 设置提示信息
			result.setMsg("修改失败，请检查数据是否合法");
			// 记录日志
			log.warn("WristStrapBackendController的updateWristStrap_Repository操作发生异常："+e);
			return result;
		}
		// 成功操作日志记录
		log.info("腕带仓库更新腕带成功，更新后信息为："+wristStrap_Repository);
		// 成功操作后响应设置
		result.setCode(1);
		result.setMsg("修改成功");
		return result;
	}
	
	
	/**
	 * 添加腕带到腕带仓库
	 * @param wristStrap_Repository
	 * @return
	 */
	@ResponseBody
	@RequestMapping("/insertOne")
	public TableDataDto<WristStrap_Repository> insertWristStrap_Repository(
			WristStrap_Repository wristStrap_Repository){
		TableDataDto<WristStrap_Repository> result = new TableDataDto<>();
		// 捕获异常
		try {
			// 调用service执行新增
			wristStrapService.insertWristStrap(wristStrap_Repository);
		} catch (RuntimeException e) {
			// 设置响应码
			result.setCode(3);
			// 设置提示信息
			result.setMsg("新增失败，请检查数据是否合法");
			// 记录日志
			log.warn("WristStrapBackendController的insertWristStrap_Repository操作发生异常："+e);
			return result;
		}
		// 记录成功操作日志
		log.info("腕带仓库新增腕带成功，新增的是："+wristStrap_Repository);
		// 设置响应码
		result.setCode(1);
		// 设置提示信息
		result.setMsg("新增成功");
		return result;
	}
	
	/**
	 * 批量添加腕带的控制器
	 * @param file
	 * @return
	 */
	@RequestMapping("/import")
	@ResponseBody
	public TableDataDto<Integer> importAll(@RequestParam("file") MultipartFile file){
		TableDataDto<Integer> result = new TableDataDto<>();
		// 获取文件提交的全名
        String fileName = file.getOriginalFilename();
        List<WristStarp> lists;
        try {
        	// 捕获自定义异常
            lists = wristStrapService.batchImport(fileName, file);
        } catch (XlsxException e) {
            result.setCode(2);
        	result.setMsg(e.getMessage());
        	// 记录日志
        	log.warn("批量添加腕带时，发生异常："+e);
        	return result;
        } catch (RuntimeException e) {
            result.setCode(3);
        	result.setMsg("服务器累了，请重新尝试");
        	// 记录日志
        	log.warn("批量添加腕带时，发生异常："+e);
        	return result;
        } catch (Exception e) {
            e.printStackTrace();
            result.setCode(4);
        	result.setMsg("批量操作异常，请联系管理员");
        	// 记录日志
        	log.warn("批量添加腕带时，发生异常："+e);
        	return result;
        }
        // 判断是否成功添加
        if(lists!=null) {
        	result.setCode(1);
        	result.setMsg("批量添加腕带成功,成功添加"+lists.size()+"条");
        	log.info("批量添加腕带成功,成功添加"+lists.size()+"条");
        }else {
        	result.setCode(2);
        	result.setMsg("批量操作失败");
        }
		return result;
		
	}
	
	/**
	 * 批量删除
	 * @param wriststrp_id
	 * @return
	 */
	@ResponseBody
	@RequestMapping("/deletelist")
	public TableDataDto<Integer> deleteList(String[] wriststrp_id){
		TableDataDto<Integer> result = new TableDataDto<>();
		try {
			//调用service方法删除
			wristStrapService.deleteWristStrapList(wriststrp_id);
		} catch (RuntimeException e) {
			// 设置响应码
			result.setCode(3);
			// 设置提示信息
			result.setMsg("删除失败，请检查数据是否合法");
			// 记录日志
			log.warn("WristStrapBackendController的deleteWristStrap_Repository操作发生异常："+e);
			return result;
		}
		log.info("成功删除腕带，他们的编号是："+Arrays.toString(wriststrp_id));
		result.setCode(1);
		result.setMsg("删除成功");
		return result;
		
	}
	
	/**
     * 控制器统一异常处理器
     * @param e
     * @return
     */
    @ExceptionHandler(Exception.class)
    public TableDataDto<Integer> resolveException(Exception e){
    	// 创建对象
    	TableDataDto<Integer> result = new TableDataDto<>();
    	// 设置参数
    	result.setMsg("操作异常，请联系管理员");
    	// 记录日志
    	log.error("WristStrapBackendController发生严重异常："+e.getMessage()+e);
    	// 设置状态
		result.setCode(4);
    	return result;
    }
}
